//
//  SocketManager.m
//  MSHD
//
//  Created by HCreater on 2017/12/17.
//  Copyright © 2017年 HCreater. All rights reserved.
//

#import "SocketManager.h"

@interface SocketManager()

@property (nonatomic, strong) MBProgressHUD* m_ReconnectHud;

@property (nonatomic, assign) BOOL m_isCallBuildConnect;

@property (nonatomic, strong) NSMutableArray* callbackByConnect;
@property (nonatomic, strong) NSMutableArray* callback8s;
@property (nonatomic, strong) NSMutableArray* callback20s;
@property (nonatomic, strong) NSMutableArray* callback21s;

@end

@implementation SocketManager

MHSingletonM(SocketManager);

- (id)init
{
    self = [super init];
    
    if (self)
    {
        [self initData];
    }
    
    return self;
}

- (void)initData
{
//    _m_isCallBuildConnect = NO;
//
//    _callbackByConnect = [NSMutableArray array];
//    _callback8s = [NSMutableArray array];
//    _callback20s = [NSMutableArray array];
//    _callback21s = [NSMutableArray array];
//
//    UserManager* userMgr = [UserManager sharedUserManager];
//    SocketRocketUtility* socketRocketUtility = [SocketRocketUtility instance];
//    AppDelegate* appdelegate = [AppDelegate sharedDelegate];
//
//    @weakify(self);
//    RACSignal* firstConnectSignal = [[[NSNotificationCenter defaultCenter] rac_addObserverForName:Notify_FirstConnect object:nil] replay];
//    RACSignal* enterForegroundSignal = [[appdelegate rac_signalForSelector:@selector(applicationWillEnterForeground:)] replay];
//
//    [firstConnectSignal subscribeNext:^(id x) {
//        @strongify(self);
//        [self checkSocket:NO];
//    }];
//
//    [enterForegroundSignal subscribeNext:^(id x) {
//        @strongify(self);
//
//        //判断是否需要重连
//        [self checkSocket:YES];
//    }];
//
//    [[[RACObserve(userMgr, userInfo) distinctUntilChanged] deliverOnMainThread] subscribeNext:^(id x) {
//        @strongify(self);
//
//        if ([userMgr isLogined] && userMgr.userInfo!=nil)
//        {
//            if (socketRocketUtility.socketReadyState == SR_OPEN)
//            {
//                if (!userMgr.isUserConnectSocket)
//                {
//                    HDUser* userInfo = x;
//
//                    [self wait2ConnectWithToken:userInfo.key callback:^(id info) {
//
//                    }];
//                }
//            }
//            else
//            {
//                [self checkSocket:NO];
//            }
//        }
//    }];
//
//    [[[[[NSNotificationCenter defaultCenter] rac_addObserverForName:kWebSocketDidOpenNote object:nil] filter:^BOOL(id value) {
//        @strongify(self);
//
//        return (!userMgr.isUserConnectSocket && [userMgr isLogined] && userMgr.userInfo!=nil);
//    }] flattenMap:^RACStream *(id value) {
//        @strongify(self);
//
//        return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//
//            [self wait2ConnectWithToken:userMgr.userInfo.key callback:^(id info) {
//
//                [subscriber sendNext:info];
//                [subscriber sendCompleted];
//            }];
//
//            return nil;
//        }];
//    }] subscribeNext:^(id x) {
//        @strongify(self);
//
//        if (_isReconnecting)
//        {
//            if ([x boolValue])
//            {
//                _isReconnecting = NO;
//
//                if (_m_ReconnectHud)
//                {
//                    [_m_ReconnectHud hideAnimated:YES];
//                }
//            }
//        }
//    }];
//
//    [[[NSNotificationCenter defaultCenter] rac_addObserverForName:kWebSocketdidReceiveMessageNote object:nil] subscribeNext:^(id x) {
//        @strongify(self);
//
//        NSNotification* notify = x;
//
//        NSDictionary* msg = notify.object;
//
//        if ([userMgr isLogined])
//        {
//            if ([msg.allKeys containsObject:@"tid"])
//            {
//                NSInteger tid = [msg[@"tid"] integerValue];
//
//                //预约回调
//                if (tid == 20)
//                {
//                    NSString* status = msg[@"status"];
//
//                    BOOL isSuc = [status isEqualToString:@"SUCCESSED"];
//                    NSString* reCode = isSuc ? msg[@"code"] : @"";
//
//                    NSDictionary* callbackInfo = @{@"State":@(isSuc), @"Code":reCode};
//
//                    [[NSNotificationCenter defaultCenter] postNotificationName:Notify_Socket_OrderResult object:callbackInfo];
//
//                    if (_callback20s!=nil && _callback20s.count>0)
//                    {
//                        for (int index=0; index<_callback20s.count; index++)
//                        {
//                            VoidBlock_id curCallback = _callback20s[index];
//                            curCallback(callbackInfo);
//                        }
//
//                        [_callback20s removeAllObjects];
//                    }
//                }
//                //取消预约
//                else if (tid == 21)
//                {
//                    NSString* status = msg[@"status"];
//
//                    BOOL isSuc = [status isEqualToString:@"SUCCESSED"];
//
//                    [[NSNotificationCenter defaultCenter] postNotificationName:Notify_Socket_CancelOrderResult object:@(isSuc)];
//
//
//                    if (_callback21s!=nil && _callback21s.count>0)
//                    {
//                        for (int index=0; index<_callback21s.count; index++)
//                        {
//                            VoidBlock_id curCallback = _callback21s[index];
//                            curCallback(@(isSuc));
//                        }
//
//                        [_callback21s removeAllObjects];
//                    }
//                }
//                //老系统扫码回调
//                else if (tid == 5)
//                {
//                    [[NSNotificationCenter defaultCenter] postNotificationName:Notify_Socket_ScanOpenResult object:@(YES)];
//                }
//                //新系统扫码回调
//                else if (tid == 8)
//                {
//                    NSString* status = msg[@"status"];
//
//                    BOOL isSuc = [status isEqualToString:@"SUCCESSED"];
//
//                    [[NSNotificationCenter defaultCenter] postNotificationName:Notify_Socket_ScanOpenResult object:@(isSuc)];
//
//                    if (_callback8s!=nil && _callback8s.count>0)
//                    {
//                        for (int index=0; index<_callback8s.count; index++)
//                        {
//                            VoidBlock_id curCallback = _callback8s[index];
//                            curCallback(@(isSuc));
//                        }
//
//                        [_callback8s removeAllObjects];
//                    }
//                }
//            }
//            else if ([msg.allKeys containsObject:@"mid"])
//            {
//                NSInteger mid = [msg[@"mid"] integerValue];
//
//                //建立链接
//                if (mid == 2)
//                {
//                    BOOL isSuc = [msg[@"code"] integerValue] == 0;
//
//                    if (!isSuc)
//                    {
//                        // 重新请求
////                        self.m_isCallBuildConnect = NO;
////
////                        [self buildConnectWithToken:userMgr.userInfo.key callback:^(id info) {
////
////                        }];
//                    }
//                    else
//                    {
////                        [userMgr userBindSocket];
////
////                        [socketRocketUtility startHeartBeat];
//                    }
//
//                    if (_callbackByConnect!=nil && _callbackByConnect.count>0)
//                    {
//                        for (int index=0; index<_callbackByConnect.count; index++)
//                        {
//                            VoidBlock_id curCallback = _callbackByConnect[index];
//                            curCallback(@(isSuc));
//                        }
//
//                        [_callbackByConnect removeAllObjects];
//                    }
//
//                    if (isSuc)
//                    {
//                        [userMgr userBindSocket];
//
//                        [socketRocketUtility startHeartBeat];
//                    }
//                }
//            }
//        }
//    }];
}

//- (void)checkSocket:(BOOL)isReconnect
//{
//    _isReconnecting = isReconnect;
//
//    UserManager* userMgr = [UserManager sharedUserManager];
//
//    SocketRocketUtility* socketRocketUtility = [SocketRocketUtility instance];
//
//    if ([userMgr isLogined])
//    {
//        if (isReconnect)
//        {
//            _m_ReconnectHud = [MBProgressHUD mh_showProgressHUD:@"重新连接中，请稍后"];
//
//            _m_isCallBuildConnect = NO;
//
//            [userMgr userUnBindSocket];
//
//            [socketRocketUtility SRWebSocketReconnect];
//        }
//        else if (socketRocketUtility.socketReadyState == SR_OPEN)
//        {
//            [socketRocketUtility sendHeartBeat];
//        }
//        else
//        {
//            if (isReconnect)
//            {
//                _m_ReconnectHud = [MBProgressHUD mh_showProgressHUD:@"重新连接中，请稍后"];
//
//                _m_isCallBuildConnect = NO;
//            }
//
//            [socketRocketUtility SRWebSocketReconnect];
//        }
//    }
//}
//
//#pragma mark - 操作
//- (void)logonOutAndReConnect
//{
//    SocketRocketUtility* socketRocketUtility = [SocketRocketUtility instance];
//
//    [socketRocketUtility SRWebSocketClose];
//
//    self.m_isCallBuildConnect = NO;
//
//    //延迟0.1s 重连
//    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.5f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//
//        [socketRocketUtility SRWebSocketOpen];
//    });
//}
//
//#pragma mark - 发送数据
//- (void)wait2ConnectWithToken:(NSString*)token callback:(VoidBlock_id)callback
//{
//    @weakify(self);
//    [self buildConnectWithToken:token callback:^(id boolValue) {
//        @strongify(self);
//
//        if ([boolValue boolValue])
//        {
//            callback(@YES);
//        }
//        else
//        {
//            [self wait2ConnectWithToken:token callback:callback];
//        }
//    }];
//}
//
//- (void)buildConnectWithToken:(NSString*)token callback:(VoidBlock_id)callback
//{
//    if (!_m_isCallBuildConnect)
//    {
//        _m_isCallBuildConnect = YES;
//    }
//    else
//    {
//        return;
//    }
//
//    if (token == nil || token.length <= 0)
//    {
//        return;
//    }
//
//    [_callbackByConnect addObject:callback];
//
//    SocketRocketUtility* socketRocketUtility = [SocketRocketUtility instance];
//
//    NSString* strData = [NSString stringWithFormat:@"{\"mid\":1,\"gid\":1,\"key\":\"%@\"}", token];
//
//    [socketRocketUtility sendData:strData];
//}
//
//- (void)buildOrderWithCabinet_id:(NSString*)cid callback:(VoidBlock_id)callback
//{
//    [_callback20s addObject:callback];
//
//    SocketRocketUtility* socketRocketUtility = [SocketRocketUtility instance];
//
//    NSString* strData = [NSString stringWithFormat:@"{\"mid\":3,\"tid\":19,\"pid\":%d,\"cabinet_id\":\"%@\"}", rand()*10, cid];
//
//    [socketRocketUtility sendData:strData];
//}
//
//- (void)buildCancelOrderWithCabinet_id:(NSString*)cid key:(NSString*)key callback:(VoidBlock_id)callback
//{
//    [_callback21s addObject:callback];
//
//    SocketRocketUtility* socketRocketUtility = [SocketRocketUtility instance];
//
//    NSString* strData = [NSString stringWithFormat:@"{\"mid\":3,\"tid\":21,\"key\":\"%@\",\"cabinet_id\":\"%@\"}", key, cid];
//
//    [socketRocketUtility sendData:strData];
//}
//
//- (void)buildScanOpenWithCabinet_id:(NSString*)cid code:(NSString*)code callback:(VoidBlock_id)callback
//{
//    [_callback8s addObject:callback];
//
//    SocketRocketUtility* socketRocketUtility = [SocketRocketUtility instance];
//
//    NSString* strData = @"";
//
//    //老系统
//    if ([NSString mh_isBlankString:code])
//    {
//        strData = [NSString stringWithFormat:@"{\"mid\":3,\"tid\":1,\"pid\":1,\"cabinet_id\":\"%@\"}", cid];
//    }
//    //新系统
//    else
//    {
//        strData = [NSString stringWithFormat:@"{\"mid\":3,\"tid\":9,\"pid\":1,\"cabinet_id\":\"%@\",\"code\":\"%@\"}", cid, code];
//    }
//
//    [socketRocketUtility sendData:strData];
//}

@end
